

package classes;

//classe per la realizzazione di punti


class Pointi {                       //tre int, uno per ogni coordinata
  int x;
  int y;
  int z;

  Pointi()                           //costruttore
  { 
    x=y=z=0;
  }

  Pointi (int x, int y)             //costruttore caso bidimensionale
  {
    this.x = x;
    this.y = y;
    this.z = 0;
  }

  Pointi (int x, int y, int z)      //costruttore caso tridimensionale
  {
    this.x = x;
    this.y = y;
    this.z = z;
  }

  
  
  /*
   * L'area con segno del triangolo formato da a,b,c; positiva se ccw, negativa se cw; serve per il test di covessità
   */
  
  public Pointi diff (Pointi a, Pointi b)
  {
      Pointi c;
      c = new Pointi();
      c.x=a.x-b.x;
      c.y=a.y-b.y;
      return c;
  }
  
  public int Area2(Pointi a, Pointi b, Pointi c)                           
  {	   
    int area=((c.x - b.x)*(a.y - b.y)) - ((a.x - b.x)*(c.y - b.y));       
      return area;
  }

  
  public int AreaSign( Pointi a, Pointi b, Pointi c )    //deriva dal prodotto vettoriale |AxB| ponendo A2=B2=0 e sostituendo A=b-a, B=c-a
  {
    double area2;
    
    area2 = ( b.x - a.x ) * (double)( c.y - a.y ) -
            ( c.x - a.x ) * (double)( b.y - a.y );

    
    /* The area should be an integer. */
    if      ( area2 >  0.5 ) return  1;
    else if ( area2 < -0.5 ) return -1;
    else                     return  0;
  }

  
  /* ---------------------------------------------------------------------
   * Ritorna true se e solo se c è strettamente alla sinistra della retta passante per a e b
   */
  
  public boolean Left( Pointi a, Pointi b, Pointi c )
  {
    return  AreaSign( a, b, c ) > 0;
  }

  public boolean LeftOn( Pointi a, Pointi b , Pointi c)
  {
    return  AreaSign( a, b, c) >= 0;
  }

  
    
  /* ---------------------------------------------------------------------
   * Ritorna true se e solo se a,b e c sono collinerari
   */
  
  public boolean Collinear( Pointi a, Pointi b, Pointi c)
  {
    return  AreaSign( a, b, c) == 0;
  }


 
}







